home *** CD-ROM | disk | FTP | other *** search
/ Software Vault: The Gold Collection / Software Vault - The Gold Collection (American Databankers) (1993).ISO / cdr47 / wasm223.zip / CHECK3.ASM < prev    next >
Assembly Source File  |  1993-05-04  |  4KB  |  103 lines

  1. ;**************************************;
  2. ; WASM Checksum Calculation, CRC Block ;
  3. ; By Eric Tauck                        ;
  4. ;                                      ;
  5. ; Defines:                             ;
  6. ;                                      ;
  7. ;   CrcBlk  return CRC of block        ;
  8. ;**************************************;
  9.  
  10.         jmp     _check3_end
  11.  
  12. ;========================================
  13. ; Calculate the 16 bit xmodem type CRC of
  14. ; a block.
  15. ;
  16. ; In: BX= address of bytes; CX= number
  17. ;     of bytes.
  18. ;
  19. ; Out: AX= checksum.
  20.  
  21. CrcBlk  PROC    NEAR
  22.         sub     ax, ax                  ;zero checksum
  23.         jcxz    _ccblk3                 ;exit if no bytes
  24.  
  25.         push    di
  26.         push    si
  27.         mov     si, bx                  ;source bytes
  28.         mov     di, OFFSET _ccblk4      ;table
  29.         cld                             ;forward direction
  30.  
  31. ;--- loop for each byte
  32.  
  33. _ccblk1 mov     bl, ah                  ;high byte to index
  34.         mov     ah, al                  ;low byte to high byte
  35.         lodsb                           ;load new byte
  36.         sub     bh, bh                  ;zero high byte of index
  37.         shl     bx                      ;offset into table
  38.         xor     ax, [bx+di]             ;update CRC
  39.         loop    _ccblk1                 ;loop if more bytes
  40.  
  41. ;--- all bytes processed, send in 16 zero bits
  42.  
  43.         inc     cx
  44.         inc     cx                      ;two more bytes
  45.  
  46. _ccblk2 mov     bl, ah                  ;high byte to index
  47.         mov     ah, al                  ;low byte to high byte
  48.         sub     al, al                  ;zero byte
  49.         sub     bh, bh                  ;zero high byte of index
  50.         shl     bx                      ;offset into table
  51.         xor     ax, [bx+di]             ;update CRC
  52.         loop    _ccblk2                 ;loop if more bytes
  53.  
  54.         pop     si
  55.         pop     di
  56. _ccblk3 ret
  57.  
  58. ; This table is used to update a 16-bit CRC by a byte as follows:
  59. ;
  60. ;   CRC = ((LowByte(CRC) * 256) + NewByte) XOR CrcTable[HighByte(CRC)]
  61.  
  62. _ccblk4 LABEL   WORD
  63.         DW      0, 4129, 8258, 12387, 16516, 20645, 24774, 28903
  64.         DW      33032, 37161, 41290, 45419, 49548, 53677, 57806
  65.         DW      61935, 4657, 528, 12915, 8786, 21173, 17044
  66.         DW      29431, 25302, 37689, 33560, 45947, 41818, 54205
  67.         DW      50076, 62463, 58334, 9314, 13379, 1056, 5121
  68.         DW      25830, 29895, 17572, 21637, 42346, 46411, 34088
  69.         DW      38153, 58862, 62927, 50604, 54669, 13907, 9842
  70.         DW      5649, 1584, 30423, 26358, 22165, 18100, 46939
  71.         DW      42874, 38681, 34616, 63455, 59390, 55197, 51132
  72.         DW      18628, 22757, 26758, 30887, 2112, 6241, 10242
  73.         DW      14371, 51660, 55789, 59790, 63919, 35144, 39273
  74.         DW      43274, 47403, 23285, 19156, 31415, 27286, 6769
  75.         DW      2640, 14899, 10770, 56317, 52188, 64447, 60318
  76.         DW      39801, 35672, 47931, 43802, 27814, 31879, 19684
  77.         DW      23749, 11298, 15363, 3168, 7233, 60846, 64911
  78.         DW      52716, 56781, 44330, 48395, 36200, 40265, 32407
  79.         DW      28342, 24277, 20212, 15891, 11826, 7761, 3696
  80.         DW      65439, 61374, 57309, 53244, 48923, 44858, 40793
  81.         DW      36728, 37256, 33193, 45514, 41451, 53516, 49453
  82.         DW      61774, 57711, 4224, 161, 12482, 8419, 20484
  83.         DW      16421, 28742, 24679, 33721, 37784, 41979, 46042
  84.         DW      49981, 54044, 58239, 62302, 689, 4752, 8947
  85.         DW      13010, 16949, 21012, 25207, 29270, 46570, 42443
  86.         DW      38312, 34185, 62830, 58703, 54572, 50445, 13538
  87.         DW      9411, 5280, 1153, 29798, 25671, 21540, 17413
  88.         DW      42971, 47098, 34713, 38840, 59231, 63358, 50973
  89.         DW      55100, 9939, 14066, 1681, 5808, 26199, 30326
  90.         DW      17941, 22068, 55628, 51565, 63758, 59695, 39368
  91.         DW      35305, 47498, 43435, 22596, 18533, 30726, 26663
  92.         DW      6336, 2273, 14466, 10403, 52093, 56156, 60223
  93.         DW      64286, 35833, 39896, 43963, 48026, 19061, 23124
  94.         DW      27191, 31254, 2801, 6864, 10931, 14994, 64814
  95.         DW      60687, 56684, 52557, 48554, 44427, 40424, 36297
  96.         DW      31782, 27655, 23652, 19525, 15522, 11395, 7392
  97.         DW      3265, 61215, 65342, 53085, 57212, 44955, 49082
  98.         DW      36825, 40952, 28183, 32310, 20053, 24180, 11923
  99.         DW      16050, 3793, 7920 
  100.         ENDP
  101.  
  102. _check3_end
  103.